/*
 * The contents of this file are subject to the Mozilla Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code is MPEG4IP.
 *
 * The Initial Developer of the Original Code is Cisco Systems Inc.
 * Portions created by Cisco Systems Inc. are
 * Copyright (C) Cisco Systems Inc. 2001.  All Rights Reserved.
 *
 * Contributor(s):
 *      Dave Mackie     dmackie@cisco.com
 */

#include "src/impl.h"

namespace mp4v2
{
    namespace impl
    {

        ///////////////////////////////////////////////////////////////////////////////

        /*
         * This is used for the 4 bit sample size below.  We need the sampleCount
         * to be correct for the number of samples, but the table size needs to
         * be correct to read and write it.
         */

        class MP4HalfSizeTableProperty : public MP4TableProperty
        {
        public:
            MP4HalfSizeTableProperty(MP4Atom &parentAtom, const char *name, MP4IntegerProperty *pCountProperty) :
                MP4TableProperty(parentAtom, name, pCountProperty) {};

            // The count is half the actual size
            uint32_t GetCount()
            {
                return (m_pCountProperty->GetValue() + 1) / 2;
            };
            void SetCount(uint32_t count)
            {
                m_pCountProperty->SetValue(count * 2);
            };
        private:
            MP4HalfSizeTableProperty();
            MP4HalfSizeTableProperty ( const MP4HalfSizeTableProperty &src );
            MP4HalfSizeTableProperty &operator= ( const MP4HalfSizeTableProperty &src );
        };


        MP4Stz2Atom::MP4Stz2Atom(MP4File &file)
            : MP4Atom(file, "stz2")
        {
            AddVersionAndFlags(); /* 0, 1 */

            AddReserved(*this, "reserved", 3); /* 2 */

            AddProperty( /* 3 */
                new MP4Integer8Property(*this, "fieldSize"));

            MP4Integer32Property *pCount =
                new MP4Integer32Property(*this, "sampleCount");
            AddProperty(pCount); /* 4 */

        }

        void MP4Stz2Atom::Read()
        {
            ReadProperties(0, 4);

            uint8_t fieldSize =
                ((MP4Integer8Property *)m_pProperties[3])->GetValue();
            //  uint32_t sampleCount = 0;

            MP4Integer32Property *pCount =
                (MP4Integer32Property *)m_pProperties[4];

            MP4TableProperty *pTable;
            if (fieldSize != 4)
            {
                pTable = new MP4TableProperty(*this, "entries", pCount);
            }
            else
            {
                // 4 bit field size uses a special table.
                pTable = new MP4HalfSizeTableProperty(*this, "entries", pCount);
            }

            AddProperty(pTable);

            if (fieldSize == 16)
            {
                pTable->AddProperty( /* 5/0 */
                    new MP4Integer16Property(*this, "entrySize"));
            }
            else
            {
                pTable->AddProperty( /* 5/0 */
                    new MP4Integer8Property(*this, "entrySize"));
            }

            ReadProperties(4);

            Skip(); // to end of atom
        }

        ///////////////////////////////////////////////////////////////////////////////

    }
} // namespace mp4v2::impl
